#include "tablemodel.h"
#include <QSqlRecord>
#include <QSqlField>
#include <QMessageBox>

TableModel::TableModel(QObject *parent, QSqlDatabase db)
    : QSqlTableModel(parent, db)
{
}

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::NoItemFlags;
    
    // 所有字段都可编辑（除了rowid）
    Qt::ItemFlags flags = QSqlTableModel::flags(index);
    if (index.column() >= 0 && index.column() < columnCount()) {
        flags |= Qt::ItemIsEditable;
    }
    return flags;
}

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    
    // 显示角色时，处理NULL值的显示
    if (role == Qt::DisplayRole) {
        QVariant value = QSqlTableModel::data(index, role);
        if (value.isNull()) {
            return QVariant("[NULL]");
        }
        return value;
    }
    
    return QSqlTableModel::data(index, role);
}

bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (!index.isValid() || role != Qt::EditRole)
        return false;
    
    // 验证数据
    if (!validateData(index, value))
        return false;
    
    // 处理NULL值
    QVariant actualValue = value;
    if (value.toString() == "[NULL]") {
        actualValue = QVariant(QVariant::String);
    }
    
    return QSqlTableModel::setData(index, actualValue, role);
}

void TableModel::setTable(const QString &tableName)
{
    QSqlTableModel::setTable(tableName);
    select();
}

bool TableModel::submitAllWithValidation()
{
    // 在提交前进行验证
    return submitAll();
}

bool TableModel::validateData(const QModelIndex &index, const QVariant &value) const
{
    // 获取字段信息
    QSqlField field = record().field(index.column());
    
    // 检查是否允许为空
    if (value.toString().isEmpty() && !field.required()) {
        return true;
    }
    
    // 可以在这里添加更多数据验证逻辑
    // 例如：检查数据类型、长度限制等
    
    return true;
}